package biblioteca;

import java.io.IOException;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Gabriel
 */
public class relatorios {
    /*    
     -- Relatório 1: livro, usuario e data de locação - livros locados

     select titulo, nome, data from emprestimo natural join livro, usuario
     where emprestimo.idusuario = usuario.idusuario
     */

    public ResultSet rel1() {
        ResultSet rs = null;
        try {
            acessoBanco ab = new acessoBanco();
            ab.conectar();
            String query = "select titulo, nome, data from emprestimo natural join livro, usuario where emprestimo.idusuario = usuario.idusuario";
            PreparedStatement stm;
            try {
                stm = ab.conn.prepareStatement(query);
                rs = stm.executeQuery(query);
                return rs;
            } catch (SQLException ex) {
                Logger.getLogger(relatorios.class.getName()).log(Level.SEVERE, null, ex);
                return null;
            }
        } catch (IOException ex) {
            Logger.getLogger(relatorios.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }

    }
    /*
     -- Relatório 2: quantos livros estão emprestados
     select count(titulo) from emprestimo where stat=true
     */

    public int rel2() {
        ResultSet rs = null;
        int r = 0;
        try {
            acessoBanco ab = new acessoBanco();
            try {
                ab.conectar();
            } catch (IOException ex) {
                Logger.getLogger(relatorios.class.getName()).log(Level.SEVERE, null, ex);
                return 0;
            }
            String query = "select count(titulo) as count from emprestimo where stat=true";
            PreparedStatement stm;
            stm = ab.conn.prepareStatement(query);
            rs = stm.executeQuery(query);
            r = rs.getInt("count");
            return r;
        } catch (SQLException ex) {
            Logger.getLogger(relatorios.class.getName()).log(Level.SEVERE, null, ex);
            return 0;
        }

    }

    /*
     -- Relatório 3: livros que não estão emprestado
        
     * select titulo, autor, ano from livro where idlivro not in
     (select idlivro from emprestimo where stat=true)
     */
    public ResultSet rel3() {
        try {
            ResultSet rs;
            acessoBanco ab = new acessoBanco();
            ab.conectar();
            String query = "select titulo, autor, ano from livro where idlivro not in (select idlivro from emprestimo where stat=true)";
            PreparedStatement stm;
            stm = ab.conn.prepareStatement(query);
            rs = stm.executeQuery(query);
            return rs;
        } catch (SQLException | IOException ex) {
            Logger.getLogger(relatorios.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
    /*
     * -- Relatório 4: usuários com livros emprestados
     select * from usuario where idusuario in
     (select idusuario from emprestimo where stat=true)
     */

    public ResultSet rel4() {
        try {
            ResultSet rs;
            acessoBanco ab = new acessoBanco();
            ab.conectar();
            String query = "select * from usuario where idusuario in"
                    + "(select idusuario from emprestimo where stat=true)";
            PreparedStatement stm;
            stm = ab.conn.prepareStatement(query);
            rs = stm.executeQuery(query);
            return rs;
        } catch (SQLException | IOException ex) {
            Logger.getLogger(relatorios.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
    /*
     * número de livros do acervo
     select count(isbn) as 'Número de livros' from livro
     */

    public int rel5() {
        try {
            ResultSet rs;
            int r;
            acessoBanco ab = new acessoBanco();
            ab.conectar();
            String query = "select count(isbn) as 'nlivros' from livro";
            PreparedStatement stm;
            stm = ab.conn.prepareStatement(query);
            rs = stm.executeQuery(query);
            r = rs.getInt("nlivros");
            return r;
        } catch (SQLException | IOException ex) {
            Logger.getLogger(relatorios.class.getName()).log(Level.SEVERE, null, ex);
            return 0;
        }
    }
    /*
     * número de usuarios que tem emprestados
     select count(idusuario) as 'Número de usuarios com livros emprstados'
     from usuario where idusuario in
     (select idusuario from emprestimo where stat=true)
     */

    public int rel6() {
        try {
            ResultSet rs;
            int r;
            acessoBanco ab = new acessoBanco();
            ab.conectar();
            String query = "select count(idusuario) as 'nusuarios'"
                    + " from usuario where idusuario in"
                    + "(select idusuario from emprestimo where stat=true)";
            PreparedStatement stm;
            stm = ab.conn.prepareStatement(query);
            rs = stm.executeQuery(query);
            r = rs.getInt("nusuarios");
            return r;
        } catch (SQLException | IOException ex) {
            Logger.getLogger(relatorios.class.getName()).log(Level.SEVERE, null, ex);
            return 0;
        }
    }
    /*
     * nome do usuário e do funcionario que fizeram o emprestimo do livro x (precisa substituir o x por um inteiro)
     select u.nome, f.nome from emprestimo e, usuario u, funcionario f
     where e.idlivro = X AND
     e.idfuncionario = f.idfuncionario AND
     e.idusuario = u.idusuario
     */

    public ResultSet rel7(int livro) {
        try {
            ResultSet rs;
            acessoBanco ab = new acessoBanco();
            ab.conectar();
            String query = "select u.nome, f.nome from emprestimo e, usuario u, funcionario f"
                    + "where e.idlivro = " + livro + "AND"
                    + "e.idfuncionario = f.idfuncionario AND"
                    + "e.idusuario = u.idusuario";
            PreparedStatement stm;
            stm = ab.conn.prepareStatement(query);
            rs = stm.executeQuery(query);
            return rs;
        } catch (SQLException | IOException ex) {
            Logger.getLogger(relatorios.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    /*
     * histórico emprestimos do usuario x
     por idusuario

     select titulo, data from emprestimo natural join livro where idusuario = x

     por nome
     select titulo, data from emprestimo e natural join livro, usuario u
     where e.idusuario = u.idusuario AND
     u.nome = 'nome do usuario'
     */
    public ResultSet rel8(int idUser) {
        try {
            ResultSet rs;
            acessoBanco ab = new acessoBanco();
            ab.conectar();
            String query = "select titulo, data from emprestimo natural join livro where idusuario = " + idUser;
            PreparedStatement stm;
            stm = ab.conn.prepareStatement(query);
            rs = stm.executeQuery(query);
            return rs;
        } catch (IOException | SQLException ex) {
            Logger.getLogger(relatorios.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    public ResultSet rel8(String nome) {
        try {
            ResultSet rs;
            acessoBanco ab = new acessoBanco();
            ab.conectar();
            String query = "select titulo, data from emprestimo e natural join livro, usuario u"
                    + "where e.idusuario = u.idusuario AND"
                    + "u.nome = '" + nome + " '";
            PreparedStatement stm;
            stm = ab.conn.prepareStatement(query);
            rs = stm.executeQuery(query);
            return rs;
        } catch (SQLException | IOException ex) {
            Logger.getLogger(relatorios.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
    /*
     * empréstimos correntes do usuario x
     por idusuario
     select titulo, data from emprestimo natural join livro 
     where idusuario = X AND
     stat = true
     por nome
     select titulo, data from emprestimo e natural join livro, usuario u
     where e.idusuario = u.idusuario AND
     u.nome = 'nome do usuario' AND
     stat = true
     */

    public ResultSet rel9(int id) {
        try {
            ResultSet rs;
            acessoBanco ab = new acessoBanco();
            ab.conectar();
            String query = "select titulo, data from emprestimo natural join livro"
                    + "where idusuario =" + id + "AND"
                    + "stat = true";
            PreparedStatement stm;
            stm = ab.conn.prepareStatement(query);
            rs = stm.executeQuery(query);
            return rs;
        } catch (SQLException | IOException ex) {
            Logger.getLogger(relatorios.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    public ResultSet rel9(String nome) {
        try {
            ResultSet rs;
            acessoBanco ab = new acessoBanco();
            ab.conectar();
            String query = "select titulo, data from emprestimo e natural join livro, usuario u" +
                            "where e.idusuario = u.idusuario AND" +
                            "u.nome = '" + nome + "' AND" +
                            "stat = true";
            PreparedStatement stm;
            stm = ab.conn.prepareStatement(query);
            rs = stm.executeQuery(query);
            return rs;
        } catch (SQLException | IOException ex) {
            Logger.getLogger(relatorios.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
}
